﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate.Cfg;
using CarCrash.Core.Model;
using CarCrash.Core;
using CarCrash.Core.Services;
using CarCrash.Core.helper;
using System.Configuration;
using System.Data.OleDb;

namespace CarCrash.Database
{
    class CarCrashDatabase
    {

        public static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Инсталлирую схему...");

                var cfg = new Configuration()
                    .AddAssembly(typeof(Pavement).Assembly)
                    .Configure();
                var schemeSetuper = new NHibernateSchemeSetuper(cfg);
                schemeSetuper.Install();

                Console.WriteLine("Успешно.");

                Console.WriteLine("Заношу данные по покрытиям...");
                var pavementService = PavementService.Instance;
                pavementService.OpenSession();

                var pavement = new Pavement("Мокрый асфальт", 0.5);
                pavementService.SaveOrUpdate(pavement);
                pavement = new Pavement("Сухой асфальт", 1.0);
                pavementService.SaveOrUpdate(pavement);
                // etc
                
                pavementService.CloseSession();
                Console.WriteLine("Успешно.");

                Console.WriteLine("Подключаюсь к базе автомобилей...");
                // ConfigurationManager не работает, не знаю почему
                string sourceDBConnectionString = ConfigurationSettings.AppSettings["connection.source_database_connection_string"];
                OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + sourceDBConnectionString);
                connection.Open();
                Console.WriteLine("Успешно.");

                var session = NHibernateHelper.OpenSession();

                Console.WriteLine("Перенос данных авто...");
                OleDbCommand query = new OleDbCommand("select * from PKW where Kennummer<>-1", connection);
                OleDbDataReader reader = query.ExecuteReader();
                using (var tran = session.BeginTransaction())
                {
                    while (reader.Read())
                    {
                        var param = new VehicleParameters(//1, 1, 1, 1
                            Convert.ToDouble(reader.IsDBNull(55) ? 0.0 : reader.GetValue(55)), // Breite
                            Convert.ToDouble(reader.IsDBNull(56) ? 0.0 : reader.GetValue(56)), // Laenge
                            Convert.ToDouble(reader.IsDBNull(74) ? 0.0 : reader.GetValue(74)), // MASSEFAHRBEREITMAX максимальная масса
                            Convert.ToInt32( (reader.IsDBNull(25) ? 0 : reader.GetValue(25)) ) // AnzAchs
                            );
                        session.Save(param);
                        // 3 колонка - марка; 4, 5 - модель (нумеруется с 0)
                        var vehicle = new Vehicle(
                            reader.IsDBNull(3) ? "?" : reader.GetString(3),
                            reader.IsDBNull(4) ? "?" : reader.GetString(4)
                                + " (" + (reader.IsDBNull(5) ? "?" : reader.GetString(5)) + ")",
                            param
                            );
                        session.Save(vehicle);
                    }
                    tran.Commit();
                }
                reader.Close();
                connection.Close();
                NHibernateHelper.CloseSession();
                Console.WriteLine("Успешно.");
                
                Console.WriteLine("Обновление базы прошло успешно!");
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Произошла ошибка: {0} \n {1}", e.Message, e.StackTrace));
            }
        }

    }

}